package com.siwei.eqi.util;

import com.siwei.eqi.pojo.entity.GuangdongLandUse;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 水网密度指数计算
 */
public class WaterDensityCalculatorUtil {

    // 归一化系数常量
    private static final BigDecimal A_DW = new BigDecimal("1005.4788");
    private static final BigDecimal MAX_DW = new BigDecimal("100");

    public static BigDecimal calculateWaterDensityIndex(GuangdongLandUse landUse) {
        // 安全获取各水域面积（处理null值）
        BigDecimal riverArea = safeGet(landUse.getRiverArea());           // 河流面积
        BigDecimal lakeArea = safeGet(landUse.getLakeArea());             // 湖泊面积
        BigDecimal reservoirArea = safeGet(landUse.getReservoirPondArea()) // 水库面积
                .subtract(safeGet(landUse.getPaddyField()));             // 排除水田面积（根据公式要求）
        BigDecimal glacierArea = safeGet(landUse.getPermanentGlacierSnow()); // 冰川雪地
        BigDecimal coastalArea = safeGet(landUse.getCoastalWaters());     // 近海面积

        // 计算分子（水域面积总和）
        BigDecimal waterSum = riverArea
                .add(lakeArea)
                .add(reservoirArea)
                .add(glacierArea)
                .add(coastalArea);

        // 获取区域国土面积（分母）
        BigDecimal la = safeGet(landUse.getCountyArea());

        // 执行公式计算
        BigDecimal dw = A_DW.multiply(waterSum)
                .divide(la, 10, RoundingMode.HALF_UP)  // 保留10位小数避免精度丢失
                .setScale(2, RoundingMode.HALF_UP);    // 最终结果保留2位小数

        // 处理最大值限制
        return dw.compareTo(MAX_DW) > 0 ? MAX_DW : dw;
    }

    // 安全获取BigDecimal值（处理null值）
    private static BigDecimal safeGet(BigDecimal value) {
        return value != null ? value : BigDecimal.ZERO;
    }

}
